
package com.huaweicloud.saaslanding.install.properties;

import static com.huaweicloud.saaslanding.install.constant.ModelConstant.ECS_SPECIFICATION_PREFIX;

import com.huaweicloud.saaslanding.basic.enumeration.IdaasEnum;
import com.huaweicloud.saaslanding.basic.utils.CheckNullUtil;

import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import shade.jetbrains.annotations.NotNull;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

/**
 * ECS规格信息
 *
 * @since 2022-03-24
 */
@EqualsAndHashCode
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@Validated
@ConfigurationProperties(prefix = ECS_SPECIFICATION_PREFIX)
public class EcsSpecification {

    /**
     * 是否启用SSL
     */
    @Value("${saaslanding-install.ssl.enable:false}")
    @NotNull
    private Boolean sslEnabled;

    /**
     * idaas 类型
     */
    @Value("${saaslanding-install.idaas.type:oneaccess}")
    @NotBlank
    private String idaasType;

    /**
     * 是否启用Keycloak单体应用 Https（license）
     */
    @Value("${saaslanding-install.idaas.application-https-mono-license.enabled:false}")
    private Boolean httpsLicenseEnabled;

    /**
     * License应用模块服务器系统盘磁盘类型
     */
    private String moduleRootVolumeType;

    /**
     * License应用模块服务器系统盘磁盘大小
     */
    private Integer moduleRootVolumeSize;

    /**
     * License应用模块服务器数据盘磁盘类型
     */
    private String moduleDataVolumeType;

    /**
     * License应用模块服务器数据盘磁盘大小
     */
    private Integer moduleDataVolumeSize;

    /**
     * License应用模块服务器系统规格ID
     */
    private String moduleFlavorRef;

    /**
     * License应用模块服务器弹性IP地址类型
     */
    private String moduleIpType;

    /**
     * License应用模块服务器带宽共享类型
     */
    private String moduleShareType;

    /**
     * License应用模块服务器带宽大小
     */
    private Integer moduleBandWidthSize;

    /**
     * License应用模块服务器镜像ID
     */
    private String moduleImageRef;

    public String getModuleRootVolumeType() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleRootVolumeType)) {
            return moduleRootVolumeType;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器系统盘磁盘类型(moduleRootVolumeType)");
        }
    }

    public Integer getModuleRootVolumeSize() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleRootVolumeSize)) {
            return moduleRootVolumeSize;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器系统盘磁盘大小(moduleRootVolumeSize)");
        }
    }

    public String getModuleDataVolumeType() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleDataVolumeType)) {
            return moduleDataVolumeType;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器数据盘磁盘类型(moduleDataVolumeType)");
        }
    }

    public int getModuleDataVolumeSize() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleDataVolumeSize)) {
            return moduleDataVolumeSize;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器数据盘磁盘大小(moduleDataVolumeSize)");
        }
    }

    public String getModuleFlavorRef() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleFlavorRef)) {
            return moduleFlavorRef;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器系统规格ID(moduleFlavorRef)");
        }
    }

    public String getModuleIpType() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleIpType)) {
            return moduleIpType;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器弹性IP地址类型(moduleIpType)");
        }
    }

    public String getModuleShareType() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleShareType)) {
            return moduleShareType;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器带宽共享类型(moduleShareType)");
        }
    }

    public Integer getModuleBandWidthSize() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleBandWidthSize)) {
            return moduleBandWidthSize;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器带宽大小(moduleBandWidthSize)");
        }
    }

    public String getModuleImageRef() {
        if ((isSslLicense() || isNoSslLicense()) && CheckNullUtil.isNotNull(moduleImageRef)) {
            return moduleImageRef;
        } else {
            throw new IllegalArgumentException("未启用单体应用（License）部署或未配置单体应用（License）模块服务器镜像ID(moduleImageRef)");
        }
    }

    private boolean isSslLicense() {
        return sslEnabled && (IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType)) || isKeyCloakEnabled();
    }

    private boolean isKeyCloakEnabled() {
        return IdaasEnum.IdaasTypeEnum.KEY_CLOAK.getName().equals(idaasType) && httpsLicenseEnabled;
    }

    private boolean isNoSslLicense() {
        return !sslEnabled && IdaasEnum.IdaasTypeEnum.ONE_ACCESS.getName().equals(idaasType) || isKeyCloakEnabled();
    }

}
